﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using AcademiaEntidades;

namespace AcademiaDAO
{
    public class MatriculaDAO
    {
        //Metodo que devuelve alumnos de un determinado curso
        public static List<MatriculaAlumnoXCursoConsulta> obtenerAlumnoXCurso(string orden, int? idCurso, int? legajo, string nombre, string apellido)
        {
            List<MatriculaAlumnoXCursoConsulta> listaAlumXCurso = new List<MatriculaAlumnoXCursoConsulta>();
            SqlConnection cn = null;
            try
            {
                cn = AccesoDato.dameConexion();
                cn.Open();
                SqlCommand cmd = new SqlCommand();
                string sql = @"select A.IdAlumno, A.Legajo as LegajoAlumno, A.Nombre as NombreAlumno, A.Apellido as ApellidoAlumno, C.Nombre as NombreCurso 
                                from Alumno A, Curso C, Matricula M where A.IdAlumno = M.IdAlumno and C.IdCurso = M.IdCurso";
               
                if (idCurso.HasValue)
                {
                    sql += " and M.IdCurso = @idCurso";
                    cmd.Parameters.Add(new SqlParameter("@idCurso", idCurso));
                }

                if (!string.IsNullOrEmpty(nombre))
                {
                    sql += " and nombre like @nombre";
                    cmd.Parameters.Add(new SqlParameter("@nombre", '%' + nombre + '%'));
                }
                if (!string.IsNullOrEmpty(apellido))
                {
                    sql += " and apellido like @apellido";
                    cmd.Parameters.Add(new SqlParameter("@apellido", '%' + apellido + '%'));
                }
                if (legajo.HasValue)
                {
                    sql += " and legajo = @legajo";
                    cmd.Parameters.Add(new SqlParameter("@legajo", legajo));
                }
                sql += " order by " + orden;

                cmd.Connection = cn;
                cmd.CommandText = sql;
                SqlDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    MatriculaAlumnoXCursoConsulta alumXCurso = new MatriculaAlumnoXCursoConsulta();
                    alumXCurso.IdAlumno = int.Parse(dr["IdAlumno"].ToString());
                    alumXCurso.LegajoAlumno = int.Parse(dr["LegajoAlumno"].ToString());
                    alumXCurso.NombreAlumno = dr["NombreAlumno"].ToString();
                    alumXCurso.ApellidoAlumno = dr["ApellidoAlumno"].ToString();
                    alumXCurso.NombreCurso = dr["NombreCurso"].ToString();
                    listaAlumXCurso.Add(alumXCurso);
                    alumXCurso = null;
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("No se pudo obtener los alumnos x curso...");
            }
            finally
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
            }
            return listaAlumXCurso;
        }//Fin del metodo obtenerAlumnoXCurso

        public static List<Matricula> obtenerTodasMatriculas()
        {
            return obtenerTodasMatriculas(null, null);
        }

        public static List<Matricula> obtenerTodasMatriculas(string orden, int? idAlumno)
        {
            List<Matricula> listaMatricula = new List<Matricula>();
            SqlConnection cn = null;
            try
            {
                cn = AccesoDato.Conectar();
                cn.Open();
                SqlCommand cmd = new SqlCommand();
                StringBuilder sql = new StringBuilder("SELECT IdMatricula, IdAlumno, IdCurso, FechaInicio, FechaFin, PrecioReal FROM Matricula WHERE 1=1");
                cmd.Connection = cn;
                // cmd.CommandText = sql;

                if (idAlumno.HasValue && idAlumno > 0)
                {
                    sql.Append(" AND IdAlumno = @IdAlumno");
                    cmd.Parameters.AddWithValue("@IdAlumno", idAlumno);
                }

                if (!string.IsNullOrEmpty(orden))
                {
                    sql.Append(" ORDER BY ").Append(orden);
                }

                cmd.CommandText = sql.ToString();

                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    int id = dr.GetInt32(0);
                    int idAlu = dr.GetInt32(1);
                    int idCur = dr.GetInt32(2);
                    DateTime fechaI = dr.GetDateTime(3);
                    DateTime fechaF = dr.GetDateTime(4);
                    decimal precReal = dr.GetDecimal(5);
                    Matricula matricula = new Matricula()
                    {
                        IdMatricula = id,
                        IdAlumno = idAlu,
                        IdCurso = idCur,
                        FechaInicio = fechaI,
                        FechaFin = fechaF,
                        PrecioReal = precReal
                    };
                     /*matricula.IdMatricula = int.Parse(dr["IdMatricula"].ToString());
                    matricula.IdAlumno = int.Parse(dr["IdAlumno"].ToString());
                    matricula.IdCurso = int.Parse(dr["IdCurso"].ToString());
                    matricula.FechaInicio = (DateTime)dr["FechaInicio"];
                    matricula.FechaFin = (DateTime)dr["FechaFin"];
                    matricula.PrecioReal = decimal.Parse(dr["PrecioReal"].ToString());*/
                    listaMatricula.Add(matricula);
                    matricula = null;
                }
                dr.Close();
            }
            catch (SqlException ex)
            {
                throw new Exception("No se pudieron obtener los datos de Matricula...");
            }
            finally
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
            }
            return listaMatricula;
        }//Fin del metodo obtenerTodasMatriculas

        public static List<Matricula> ObtenerPorAlumno(int idAlumno)
        {
            return obtenerTodasMatriculas(null, idAlumno);
        }
    }//Fin de la clase
}//Fin del namespace
